{"componentChunkName":"component---src-templates-post-tsx","path":"/python-styudy_13/","result":{"data":{"markdownRemark":{"html":"<ul>\n<li>재귀 함수</li>\n<li>재귀 함수의 문제</li>\n</ul>\n<hr>\n<h2 id=\"재귀-함수\" style=\"position:relative;\"><a href=\"#%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98\" aria-label=\"재귀 함수 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>재귀 함수</h2>\n<h3 id=\"반복문으로-팩토리얼-구하기\" style=\"position:relative;\"><a href=\"#%EB%B0%98%EB%B3%B5%EB%AC%B8%EC%9C%BC%EB%A1%9C-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC-%EA%B5%AC%ED%95%98%EA%B8%B0\" aria-label=\"반복문으로 팩토리얼 구하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>반복문으로 팩토리얼 구하기</h3>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">factorial</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    output <span class=\"token operator\">=</span><span class=\"token number\">1</span>\n    <span class=\"token keyword\">for</span> i <span class=\"token keyword\">in</span> <span class=\"token builtin\">range</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> n<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n        output<span class=\"token operator\">*=</span><span class=\"token number\">1</span>\n    <span class=\"token keyword\">return</span> output\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"1! :\"</span><span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"2! :\"</span><span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"3! :\"</span><span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"4! :\"</span><span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>▶ 실행결과</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">1! : 1\n2! : 2\n3! : 6\n4! : 24</code></pre></div>\n<h3 id=\"재귀-함수로-팩토리얼-구하기\" style=\"position:relative;\"><a href=\"#%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98%EB%A1%9C-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC-%EA%B5%AC%ED%95%98%EA%B8%B0\" aria-label=\"재귀 함수로 팩토리얼 구하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>재귀 함수로 팩토리얼 구하기</h3>\n<p><strong>재귀</strong>란 '자기 자신을 호출하는 것'을 의미합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">factorial</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span><span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">else</span> <span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> n<span class=\"token operator\">*</span>factorial<span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"1! :\"</span><span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"2! :\"</span><span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"3! :\"</span><span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"4! :\"</span><span class=\"token punctuation\">,</span> factorial<span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>▶ 실행결과</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">1! : 1\n2! : 2\n3! : 6\n4! : 24</code></pre></div>\n<hr>\n<h2 id=\"재귀-함수의-문제\" style=\"position:relative;\"><a href=\"#%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98%EC%9D%98-%EB%AC%B8%EC%A0%9C\" aria-label=\"재귀 함수의 문제 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>재귀 함수의 문제</h2>\n<p>재귀 함수는 상황에 따라서 같은 것을 기하급수적으로 많이 반복한다는 문제가 있습니다. 재귀 함수로 인해 발생하는 문제를 알아보고 이후 문제를 해결할 수 있는 <strong>메모화</strong>라는 기술을 알아보려합니다.</p>\n<h3 id=\"재귀-함수로-피보나치-수열-구현하기\" style=\"position:relative;\"><a href=\"#%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98%EB%A1%9C-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%EC%88%98%EC%97%B4-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0\" aria-label=\"재귀 함수로 피보나치 수열 구현하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>재귀 함수로 피보나치 수열 구현하기</h3>\n<p><strong>피보나치 수열</strong>은 '토끼는 어떠한 속도로 번식하는가'와 같은 연구에 사용되는 수열 입니다. 다음과 같은 규칙을 가지고 있습니다.</p>\n<ul>\n<li>처음에는 토끼가 한 쌍만 존재합니다.</li>\n<li>두 달 이상 된 토끼는 번식할 수 있습니다.</li>\n<li>번식한 또끼는 매달 새끼를 한 쌍씩 낳습니다.</li>\n<li>토끼는 죽지 않는다고 가정합니다.</li>\n</ul>\n<p>이와 같은 규칙으로 한 달이 지날 때마다 달라지는 토끼 쌍의 수를 적어보면 '1쌍, 1쌍, 2쌍, 3쌍, 5쌍, 8쌍, 13쌍 ....'이 됩니다.<br>\n규칙을 나타내보면 이와 다음과 같습니다.</p>\n<ul>\n<li>1번째 수열 =1</li>\n<li>2번째 수열 =1</li>\n<li>n번째 수열 = (n-1)번째 수열 + (n-2) 번째 수열</li>\n</ul>\n<p>이를 코드로 구현해 보면 다음과 같습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">def</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span><span class=\"token number\">2</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">else</span> <span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> fibonacci<span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> fibonacci<span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(1):\"</span><span class=\"token punctuation\">,</span> fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(2):\"</span><span class=\"token punctuation\">,</span> fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(3):\"</span><span class=\"token punctuation\">,</span> fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(4):\"</span><span class=\"token punctuation\">,</span> fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(35):\"</span><span class=\"token punctuation\">,</span> fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">35</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>▶ 실행결과</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">fibonacci(1): 1\nfibonacci(2): 1\nfibonacci(3): 2\nfibonacci(4): 3\nfibonacci(35): 9227465</code></pre></div>\n<p>fibonacci(35)를 입력해서 35번째 피보나치 수를 구하면, 시간이 좀 오래 걸리는 걸 확인 할 수 있습니다.<br>\n왜 오래 걸리는지 코드를 변경해 문제를 확인해 보려합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">counter <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n<span class=\"token keyword\">def</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fibonacci({})를 구합니다.'</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">global</span> counter\n    counter<span class=\"token operator\">+=</span><span class=\"token number\">1</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span><span class=\"token number\">2</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">else</span> <span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> fibonacci<span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> fibonacci<span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n\nfibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"---\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(10) 계산에 활용된 덧셈 횟수는 109번입니다.\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>▶ 실행결과</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">fibonacci(10)를 구합니다.\nfibonacci(9)를 구합니다.\n... 생략 ...\nfibonacci(1)를 구합니다.\nfibonacci(2)를 구합니다.\n---\nfibonacci(10) 계산에 활용된 덧셈 횟수는 109번입니다.</code></pre></div>\n<p>코드를 실행해보면 같은 것을 여러 번 연산한다는 것을 확인할 수 있습니다.</p>\n<h4 id=\"unboundlocalerror-살펴보기\" style=\"position:relative;\"><a href=\"#unboundlocalerror-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0\" aria-label=\"unboundlocalerror 살펴보기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>UnboundLocalError 살펴보기</h4>\n<p>위의 코드를 보면 <code class=\"language-text\">global counter</code>라고 되어 있는 부분이 있습니다.\n왜 이런 코드를 사용해야하는지 살펴보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">counter <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\n<span class=\"token keyword\">def</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fibonacci({})를 구합니다.'</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">format</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token comment\"># global counter  이 부분을 지워보겠습니다.</span>\n    counter<span class=\"token operator\">+=</span><span class=\"token number\">1</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span><span class=\"token number\">1</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token operator\">==</span><span class=\"token number\">2</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token number\">1</span>\n    <span class=\"token keyword\">else</span> <span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> fibonacci<span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> fibonacci<span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n\nfibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"---\"</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(10) 계산에 활용된 덧셈 횟수는 109번입니다.\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>▶ 실행결과</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">Traceback <span class=\"token punctuation\">(</span>most recent call last<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n  File <span class=\"token string\">\"c:\\Users\\다은\\Desktop\\test\\format3.py\"</span><span class=\"token punctuation\">,</span> line <span class=\"token number\">13</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">in</span> <span class=\"token operator\">&lt;</span>module<span class=\"token operator\">></span>\n    fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n  File <span class=\"token string\">\"c:\\Users\\다은\\Desktop\\test\\format3.py\"</span><span class=\"token punctuation\">,</span> line <span class=\"token number\">5</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">in</span> fibonacci\n    counter<span class=\"token operator\">+=</span><span class=\"token number\">1</span>\nUnboundLocalError<span class=\"token punctuation\">:</span> local variable <span class=\"token string\">'counter'</span> referenced before assignment</code></pre></div>\n<p>실행결과를 보면 <code class=\"language-text\">UnboundLocalError</code>를 확인할 수 있습니다.<br>\n파이썬은 함수 내부에서 함수 외부에 있는 변수를 참조하지 못합니다.<br>\n그래서 함수 내부에서 함수 외부에 있는 변수라는 것을 알리기 위해 <code class=\"language-text\">global 변수 이름</code> 이라는 구문을 사용한 것 입니다.</p>\n<h3 id=\"메모화\" style=\"position:relative;\"><a href=\"#%EB%A9%94%EB%AA%A8%ED%99%94\" aria-label=\"메모화 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>메모화</h3>\n<p>현재 재귀함수로 구현한 피보나치 수열의 문제는 같은 값을 구하는 연산을 반복하고 있기 때문에 발생하는 것 입니다.<br>\n따라서 같은 값을 한 번만 계산하도록 코드를 수정해 문제를 해결해 보려 합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">counter <span class=\"token operator\">=</span> <span class=\"token number\">0</span>\ndictionary <span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n    <span class=\"token number\">1</span><span class=\"token punctuation\">:</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n    <span class=\"token number\">2</span><span class=\"token punctuation\">:</span><span class=\"token number\">1</span>\n<span class=\"token punctuation\">}</span>\n<span class=\"token keyword\">def</span> <span class=\"token function\">fibonacci</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">if</span> n <span class=\"token keyword\">in</span> dictionary<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> dictionary<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">else</span> <span class=\"token punctuation\">:</span>\n        output <span class=\"token operator\">=</span> fibonacci<span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> fibonacci<span class=\"token punctuation\">(</span>n<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span>\n        dictionary<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> output\n        <span class=\"token keyword\">return</span> output\n\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(1):\"</span><span class=\"token punctuation\">,</span> fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(2):\"</span><span class=\"token punctuation\">,</span> fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(3):\"</span><span class=\"token punctuation\">,</span> fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(4):\"</span><span class=\"token punctuation\">,</span> fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">4</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"fibonacci(35):\"</span><span class=\"token punctuation\">,</span> fibonacci<span class=\"token punctuation\">(</span><span class=\"token number\">35</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><code class=\"language-text\">fibonacci(35)</code>를 실행했을 때 아까와는 다르게 값이 바로 나오는 것을 확인할 수 있습니다!<br>\n코드를 살펴보면 딕셔너리를 사용해 한 번 계산한 값을 저장합니다. 이를 <strong>메모화</strong>한다고 표현합니다.<br>\n딕셔너리에 값이 메모되 있으면 처리를 수행하지 않고 곧바로 메모된 값을 돌려주면서 코드의 속도를 빠르게 만드는 것입니다.</p>\n<hr>\n<h4 id=\"reference\" style=\"position:relative;\"><a href=\"#reference\" aria-label=\"reference permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Reference</h4>\n<ul>\n<li><a href=\"https://www.hanbit.co.kr/store/books/look.php?p_code=B2587075793\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">혼자 공부하는 파이썬</a></li>\n</ul>","excerpt":"재귀 함수 재귀 함수의 문제 재귀 함수 반복문으로 팩토리얼 구하기 ▶ 실행결과 재귀 함수로 팩토리얼 구하기 재귀란 '자기 자신을 호출하는 것'을 의미합니다. ▶ 실행결과 재귀 함수의 문제 재귀 함수는 상황에 따라서 같은 것을 기하급수적으로 많이 반복…","tableOfContents":"<ul>\n<li>\n<p><a href=\"/python-styudy_13/#%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98\">재귀 함수</a></p>\n<ul>\n<li><a href=\"/python-styudy_13/#%EB%B0%98%EB%B3%B5%EB%AC%B8%EC%9C%BC%EB%A1%9C-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC-%EA%B5%AC%ED%95%98%EA%B8%B0\">반복문으로 팩토리얼 구하기</a></li>\n<li><a href=\"/python-styudy_13/#%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98%EB%A1%9C-%ED%8C%A9%ED%86%A0%EB%A6%AC%EC%96%BC-%EA%B5%AC%ED%95%98%EA%B8%B0\">재귀 함수로 팩토리얼 구하기</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/python-styudy_13/#%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98%EC%9D%98-%EB%AC%B8%EC%A0%9C\">재귀 함수의 문제</a></p>\n<ul>\n<li><a href=\"/python-styudy_13/#%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98%EB%A1%9C-%ED%94%BC%EB%B3%B4%EB%82%98%EC%B9%98-%EC%88%98%EC%97%B4-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0\">재귀 함수로 피보나치 수열 구현하기</a></li>\n<li><a href=\"/python-styudy_13/#%EB%A9%94%EB%AA%A8%ED%99%94\">메모화</a></li>\n</ul>\n</li>\n</ul>","fields":{"slug":"/python-styudy_13/"},"frontmatter":{"title":"혼자 공부하는 파이썬 - 함수의 활용","date":"Jul 23, 2021","tags":["Python"],"keywords":["python","혼자공부하는파이썬","재귀 함수"],"update":"Jan 01, 0001"}}},"pageContext":{"slug":"/python-styudy_13/","series":[{"slug":"/python-styudy_13/","title":"혼자 공부하는 파이썬 - 함수의 활용","num":13}],"lastmod":"2021-07-23"}},"staticQueryHashes":["2027115977","694178885"]}